home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / c / ExtrasLib.lha / ExtrasLib / Source / GTLIB / GTMX.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-30  |  4.9 KB  |  221 lines

  1. #include <utility/pack.h>
  2. #include <extras/gtobject.h>
  3.  
  4. struct mxData
  5. {
  6.   struct TextAttr *mx_TA;
  7.   struct TextFont *mx_TF;
  8.   LONG   Width,Height;
  9. //  struct Gadget *mx_Gad;
  10. //  struct NewGadget *mx_NGad
  11.   struct IBox mx_Domain[3];
  12. };
  13.  
  14. #define MX_TAGS 6
  15.  
  16. struct TagList MX_Tags[MX_TAGS]=
  17. {
  18.   GTMX_Labels,      0,
  19.   GTMX_Active,      0,
  20.   GTMX_Spacing,     1,
  21.   GTMX_Scaled,      0,
  22.   GTMX_TitlePlace,  0,
  23.   GTA_Flags,        0,
  24.   GTA_TextAttr,     0,
  25.   TAG_DONE,         0,
  26. };
  27.  
  28. LONG MX_Dispatch(Class *C, Object *O, Msg *M)
  29. {
  30.   gd=INST_DATA(C,O);
  31.   switch(M->MethodID)
  32.   {
  33.     case OM_NEW:
  34.       if(O=DoSuperMethodA(C,O,M))
  35.       {
  36.         gd=INST_DATA(C,O);
  37.         
  38.         gd->mx_GTags=CloneTagItems(MX_Tags);
  39.         
  40.         GTMX_SetGadgetAttrs(C,O,M);
  41.       }
  42.       rv=O;
  43.       break;
  44.     case OM_DELETE:
  45.       FreeTagItems(gd->mx_GTags);
  46.       rv=0;
  47.       break;
  48.     case OM_SET:
  49.       rv=GTMX_SetAttrs(C,O,(APTR)M);
  50.       break;
  51.     case OM_GET:
  52.       rv=GTMX_GetAttrs(C,O,(APTR)M);
  53.       break;
  54.   }
  55.   return(O);
  56. }
  57.  
  58. LONG GTMX_SetAttrs(struct Class *C, struct Object *O, struct opSet *Set)
  59. {
  60.   struct TagItem *settags;
  61.   STRPTR *labels, title;
  62.   LONG labelcnt, spacing, scaled, tplace;
  63.   
  64.   if(settags=CloneTagItems(Set->ops_AttrList))
  65.   {
  66.     FilterTagItems(settags,gdata->mx_GTTags,TAGFILTER_AND);
  67.     if(Set->MethodID==OM_SET)
  68.     {
  69.       DoSuperMethodA(C,O,(Msg *)Set);
  70.     }
  71.     DoSuperMethod(C,O,GTM_SETGTATTRS,settags);
  72.     
  73.     FilterTagChanges(settags,gdata->mx_GTTags,1);
  74.     labels    =GetTagData(GTMX_Labels,  0, gdata->mx_GTTags)
  75.     labelcnt  =gt_CountStrings(labels);
  76.     spacing   =GetTagData(GTMX_Spacing,      0, gdata->mx_GTTags);
  77.     scaled=0;
  78.     tplace=0;
  79.     if(GadToolsBase->lib_Version>=39)
  80.     {
  81.       scaled  =(GetTagData(GTMX_Scaled,      0, gdata->mx_GTTags));
  82.       tplace  =(GetTagData(GTMX_TitlePlace,  0, gdata->mx_GTTags));
  83.     }
  84.  
  85.     gd->mx_Domain[0].Height = (gd->mx_TA->ta_YSize + spacing) * labelcnt;
  86.     gd->mx_Domain[0].Width  = 0;
  87.     if(labels)
  88.     {
  89.       while(*labels)
  90.       {
  91.         gd->mx_Domain[0].Width = max(gd->mx_Domain[0].Width, StrLength(   SL_TextFont,    gd->mx_TF,
  92.                                                                           SL_String,      *labels,
  93.                                                                           TAG_DONE));
  94.         labels++;
  95.       }
  96.     }
  97.     gd->mx_Domain[0].Width += gd->mx_Width + 8;
  98.     
  99.     if(tplace)
  100.     {
  101.       switch(tplace)
  102.       {
  103.         case PLACETEXT_ABOVE:
  104.         case PLACETEXT_BELOW:
  105.           gd->mx_Domain[0].Width = max(gd->mx_Domain[0].Width,StrLength(   SL_TextFont,    gd->mx_TF,
  106.                                                                            SL_String,      gd->mx_GadgetText,
  107.                                                                            TAG_DONE));
  108.           gd->mx_Domain[0].Height+= 4 + gd->mx_TF->tf_YSize;
  109.           break;
  110.         case PLAVETEXT_LEFT:
  111.         case PLACETEXT_RIGHT:
  112.           
  113.     }
  114.     
  115.     FreeTagItems(settags);
  116.   }
  117. }
  118.  
  119. LONG GTMX_GetAttr(struct Class *C, struct Object *O, struct opGet *Get)
  120. {
  121.   APTR data;
  122.   
  123.   rv=1;
  124.   
  125.   switch(Get->opg_AttrID)
  126.   {
  127.     case GTA_Dimensions:
  128.       data=gdata->mx_Dimensions;
  129.       break;
  130.     // Gadtools tags
  131.     case GTMX_Active:
  132.       data->gdata->mx_Active;
  133.       break;
  134.     default:
  135.       rv=0;
  136.   }
  137.   
  138.   if(rv)
  139.   {
  140.     *(Get->opg_Storage)=data;
  141.   }
  142. }
  143.  
  144. void mxCreateGadget(C,O,CG)
  145. {
  146.   
  147. }
  148.  
  149.  
  150. ULONG mxGetSize(struct gtpGetSize *GS)
  151.       
  152.       if(scaled)
  153.       {
  154.         mxh=font->tf_YSize+1;
  155.         mxw=max(17,mxh);
  156.       }
  157.       
  158.       while(*labels)
  159.       {
  160.         LONG lablen;
  161.         
  162.         lablen=StrLength( SL_TextFont,    font,
  163.                           SL_String,      *labels,
  164.                           TAG_DONE);
  165.         maxlabellen=max(maxlabellen,labellen);
  166.         labels++;
  167.       }
  168.       
  169.       domain.Width  = mxw + 8 + malabellen;
  170.       domain.Height = (mxh + spacing) * labelcnt - spacing;
  171.       
  172.       if(flags & PLACETEXT_LEFT)
  173.         domain.Left-=maxlabellen;
  174.       else
  175.         domain.Left=0;
  176.       
  177.       domain.Top=0;
  178.       
  179.       CloseFont(font);
  180.     }
  181.   }
  182.   
  183.   GS->gtpgs_Domain[0]=domain;
  184.   GS->gtpgs_Domain[1]=domain;
  185.   GS->gtpgs_Domain[2]=domain;
  186.   return(1);
  187. }
  188.  
  189.  
  190.  
  191.  
  192. /*
  193.   if(tplace)
  194.   {
  195.     switch(tplace)
  196.     {
  197.       case PLACETEXT_ABOVE:
  198.       case PLACETEXT_BELOW:
  199.         {
  200.           LONG ll;
  201.           struct IBox lbox;
  202.           
  203.           ll=StrLength(SL_TextFont,    gd->mx_TF,
  204.                        SL_String,      gd->mx_GadgetText,
  205.                        TAG_DONE));
  206.           lbox.Width    = ll;
  207.           lbox.Height   = gd->mx_TF->tf_YSize;
  208.           lbox.LeftEdge = gd->
  209.           
  210.           
  211.           Size->gtps_Domain->Left  = min(Size->gtps_Domain->Left, -(ll    
  212.           Size->gtps_Domain->Width = max(Size->gtps_Domain->Width, ll );
  213.           Size->gtps_Domain->Height+= 4 + gd->mx_TF->tf_YSize;
  214.         }
  215.         break;
  216.       case PLAVETEXT_LEFT:
  217.       case PLACETEXT_RIGHT:
  218.         
  219.   }
  220.   */
  221.